package ufcg.edu.br.bigu;

import java.util.ArrayList;
import java.util.List;

public class Carona {


	private String idCarona;
	
	private List<SugestaoEncontro> pontosSugeridos;
	private List<SolicitacaoVaga> solicitacoes;
	
	private List<SolicitacaoVaga> solicitacoesAceitas;
	
	public String getIdCarona() {
		return idCarona;
	}

	public void setIdCarona(String idCarona) {
		this.idCarona = idCarona;
	}

	private String origem;
	private String destino;
	private String data;
	private String hora;
	private String idSessao;
	private int vagas;

	public int getVagas() {
		return vagas;
	}

	public void setVagas(int vagas) {
		this.vagas = vagas;
	}

	public String getOrigem() {
		return origem;
	}

	public void setOrigem(String origem) {
		this.origem = origem;
	}

	public String getDestino() {
		return destino;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public String getHora() {
		return hora;
	}

	public void setHora(String hora) {
		this.hora = hora;
	}

	public String getIdSessao() {
		return idSessao;
	}

	public void setIdSessao(String idSessao) {
		this.idSessao = idSessao;
	}

	public String getAtributoCarona(String atributo) {

		if (atributo.equals("idSessao")) {
			return this.getIdSessao();
		}

		if (atributo.equals("origem")) {
			return this.getOrigem();
		}

		if (atributo.equals("destino")) {
			return this.getDestino();
		}

		if (atributo.equals("data")) {
			return this.getData();
		}

		if (atributo.equals("hora")) {
			return this.getHora();
		}

		if (atributo.equals("vagas")) {
			return String.valueOf(this.getVagas());
		}

		return null;
	}

	public Carona(String idSessao, String origem, String destino, String data,
			String hora, String vagas) throws Exception {

		this.validarParametros(idSessao, origem, destino, data, hora, vagas);

		try {
			this.vagas = Integer.parseInt(vagas);
		} catch (Exception e) {
			throw new Exception(Constantes.MSG_ERRO_VAGA_INVALIDO);
		}

		this.idSessao = idSessao;
		this.data = data;
		this.destino = destino;
		this.hora = hora;
		this.origem = origem;
		
		pontosSugeridos = new ArrayList<SugestaoEncontro>();
		solicitacoes = new ArrayList<SolicitacaoVaga>();
		solicitacoesAceitas = new ArrayList<SolicitacaoVaga>();

	}

	private void validarParametros(String idSessao2, String origem2,
			String destino2, String data2, String hora2, String vagas2)
			throws Exception {

		if (idSessao2 == null) {
			throw new Exception(Constantes.MSG_ERRO_SESSAO_INVALIDO);
		}
		if (origem2 == null) {
			throw new Exception(Constantes.MSG_ERRO_ORIGEM_INVALIDO);
		}

		if (destino2 == null) {
			throw new Exception(Constantes.MSG_ERRO_DESTINO_INVALIDO);
		}

		if (data2 == null) {
			throw new Exception(Constantes.MSG_ERRO_DATA_INVALIDO);
		}
		if (hora2 == null) {
			throw new Exception(Constantes.MSG_ERRO_HORA_INVALIDO);
		}

		if (vagas2 == null) {
			throw new Exception(Constantes.MSG_ERRO_VAGA_INVALIDO);
		}

		if (Constantes.STRING_VAZIA.equals(idSessao2)) {
			throw new Exception(Constantes.MSG_ERRO_SESSAO_INVALIDO);
		}

		if (Constantes.STRING_VAZIA.equals(origem2)) {
			throw new Exception(Constantes.MSG_ERRO_ORIGEM_INVALIDO);
		}
		if (Constantes.STRING_VAZIA.equals(destino2)) {
			throw new Exception(Constantes.MSG_ERRO_DESTINO_INVALIDO);
		}

		if (Constantes.STRING_VAZIA.equals(data2)) {
			throw new Exception(Constantes.MSG_ERRO_DATA_INVALIDO);
		}

		if (Constantes.STRING_VAZIA.equals(hora2)) {
			throw new Exception(Constantes.MSG_ERRO_HORA_INVALIDO);
		}
		if (Constantes.STRING_VAZIA.equals(vagas2)) {
			throw new Exception(Constantes.MSG_ERRO_VAGA_INVALIDO);
		}

	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((idCarona == null) ? 0 : idCarona.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Carona other = (Carona) obj;
		if (idCarona == null) {
			if (other.idCarona != null)
				return false;
		} else if (!idCarona.equals(other.idCarona))
			return false;
		return true;
	}

	public String getTrajeto() {

		StringBuffer retorno = new StringBuffer();
		retorno.append(origem);
		retorno.append(" - ");
		retorno.append(destino);
		
		return retorno.toString();
	}

	
	public String toString() {
		

		StringBuffer retorno = new StringBuffer();
		retorno.append(origem);
		retorno.append(" para ");
		retorno.append(destino);
		retorno.append(", no dia ");
		retorno.append(data);
		retorno.append(", as ");
		retorno.append(hora);
		
		return retorno.toString();
	}

	public String addSugestaoPontoEncontro(SugestaoEncontro sugestao) {
		
		String idSugestao = this.gerarIdSugestao(sugestao);
		sugestao.setIdSugestao(idSugestao);
		pontosSugeridos.add(sugestao);
		
		return idSugestao;
	}
	
	
	private String gerarIdSugestao(SugestaoEncontro sugestao) {
		int nextId = pontosSugeridos.size() + 1;
		
		StringBuffer retorno = new StringBuffer();
		retorno.append(idCarona);
		retorno.append("_S");
		retorno.append(nextId);
		retorno.append("ID");
		
		return retorno.toString();
	}

	public void responderSugestaoPontoEncontro(String idSugestao, String pontos) throws Exception {
		
		if (pontos == null){
			throw new Exception(Constantes.MSG_ERRO_PONTO_INVALIDO);
		}
		if (Constantes.STRING_VAZIA.equals(pontos)){
			throw new Exception(Constantes.MSG_ERRO_PONTO_INVALIDO);
		}

		for(SugestaoEncontro s: pontosSugeridos){
			if(s.getIdSugestao().equals(idSugestao)){
				s.setPontos(pontos);
			}
		}
	}

	public String addSolicitacaoPontoEncontro(SolicitacaoVaga s) {

		String IdSolicitacao = this.gerarIdSolicitacao(s);
		s.setIdSolicitacao(IdSolicitacao);
		solicitacoes.add(s);
		
		return IdSolicitacao;
	}
	
	
	private String gerarIdSolicitacao(SolicitacaoVaga s) {
		int nextId = solicitacoes.size() + 1;
		
		StringBuffer retorno = new StringBuffer();
		retorno.append(idCarona);
		retorno.append("_SOL");
		retorno.append(nextId);
		retorno.append("ID");
		
		return retorno.toString();
		
	}
	
	public void aceitarSolicitacaoPontoEncontro(String idSolicitacao){
		SolicitacaoVaga remove = null;
		for (SolicitacaoVaga s: solicitacoes){
			if (s.getIdSolicitacao().equals(idSolicitacao)){
				remove = s;
				vagas--;
				solicitacoesAceitas.add(s);
				
			}
		}
		if (remove != null){
			solicitacoes.remove(remove);
			
		}
	}

	public boolean contemSolicitacao(String idSolicitacao) {
		
		for (SolicitacaoVaga s: solicitacoes){
			if(s.getIdSolicitacao().equals(idSolicitacao)){
				return true;
			}
		}
		
		return false;
	}
		

	
	
}
